home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
texte
/
qed
/
src
/
wp_print.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-06-18
|
8KB
|
425 lines
/*
* Dieses Modul basiert auf einem Modula2-Quelltext von Uwe Mindrup @ LB
*/
#include <string.h>
#include <osbind.h>
#include <time.h>
#include "global.h"
#include "wp-print.h"
#define MAX_SEQUENCE 0x4F
#define MAXTRANSLATIONS 0xFF
/* es folgen die Konstanten für den Tabelleneingang der Funktionen: */
#define VERTPOS 5
#define BOLD 6
#define ITALIC 0xA
#define LIGHT 0xE
#define SUPERSCRIPT 0x12
#define SUBSCRIPT 0x16
#define _UNDERLINE 0x1A
#define HORZINIT 0x1F
#define VERTINIT 0x20
#define PRINTERINIT 0x21
#define _1STTYPE 0x28
#define _1STCOLOR 0x30
#define PROP 0x35
#define FORMFEED 0x1E
#define WRITELN 1
#define TAB 0x09
typedef struct
{
int len;
int pos;
} TABLEENTRY;
/*
* lokale Variablen
*/
static TABLEENTRY seq_table[MAX_SEQUENCE + 1],
trans_table[MAXTRANSLATIONS + 1];
static char *cfg_ptr;
static int prn_hdl,
char_pos, /* Position des Zeichens in der aktuellen Zeile */
nr_spaces, /* Anzahl Leerzeichen */
nlq_set, /* [0..2] */
akt_mode, akt_color,
tab_size,
prop_size;
static bool proportional,
config_read = FALSE;
static char cfg_name[256];
/*
* lokale Prozeduren
*/
static void init_tables(void) /* Tabellen initialisieren */
{
int i;
for (i = 0; i <= MAX_SEQUENCE; i++)
seq_table[i].len = 0;
for (i = 0; i <= MAXTRANSLATIONS; i++)
trans_table[i].len = 0;
char_pos = 0;
}
static bool out(char ch)
{
if (prn_hdl == -2)
Cauxout(ch);
else if (prn_hdl == -3)
Cprnout(ch);
else
Fwrite(prn_hdl, 1, &ch);
return TRUE;
}
static bool print_seq(int which)
{
int i;
bool ok;
for (i = seq_table[which].pos; i <= seq_table[which].pos + seq_table[which].len - 1; i++)
{
ok = out(cfg_ptr[i]);
if (!ok)
break;
}
return ok;
}
static bool print(int entry, bool set) /* Ausgabe der angewählten Steuersequenz */
{
if (!set)
entry++;
return print_seq(entry + nlq_set);
}
static bool write_char(char ch)
{
int i;
bool ok;
if (trans_table[ch].len > 0)
{
for (i = trans_table[ch].pos; i <= trans_table[ch].pos + trans_table[ch].len - 1; i++)
{
ok = out(cfg_ptr[i]);
if (!ok)
break;
}
char_pos++;
}
else
{
ok = out(ch);
char_pos++;
}
return ok;
}
static bool set_head(void) /* Druckkopf neu positionieren */
{
int i, len, pos;
bool ok;
len = seq_table[VERTPOS].len;
pos = seq_table[VERTPOS].pos;
for (i = pos; i <= pos + len - 1; i++)
{
if (cfg_ptr[i] == 0x80)
ok = out((char_pos * 60 / prop_size) % 256);
else if (cfg_ptr[i] == 0x81)
ok = out((char_pos * 60 / prop_size) / 256);
else
ok = out(cfg_ptr[i]);
if (!ok)
break;
}
nr_spaces = 0;
return ok;
}
/*
* exportierte Prozeduren
*/
bool wp_load_cfgfile(char *name)
{
long length, err;
int f, i, j, Pos, Len;
if ((strcmp(name, cfg_name) == 0) && config_read) /* Config bereits geladen */
return TRUE;
else
{
strcpy(cfg_name, name);
config_read = FALSE;
}
err = Fopen(name, 0);
if (err < 0)
return FALSE;
f = (int)err;
if (cfg_ptr != NULL)
Mfree(cfg_ptr);
length = Fseek(0, f, 2); /* ganz ans Ende */
cfg_ptr = Malloc(length);
if (cfg_ptr == NULL)
{
Fclose(f);
return FALSE;
}
Fseek(0, f, 0); /* zurück zum Anfang */
err = Fread(f, length, cfg_ptr);
Fclose(f);
init_tables();
/* Kennung überprüfen: */
if (strncmp(cfg_ptr, "GST-CFG:", 8) != 0)
return FALSE; /* keine GST-CFG-Datei !!! */
/* Jetzt müssen die Tabellen aufgebaut werden: */
i = 8; /* Druckernamen überspringen */
while (cfg_ptr[i] != '\0')
i++;
i += 7; /* Druckeranpassungen interessieren nicht. */
/* zunächst die Tabelle der Druckerbesonderheiten: */
while (cfg_ptr[i] != '\0') /* Tabelle wird mit einem NUL-Byte beendet */
{
Len = cfg_ptr[i];
Pos = cfg_ptr[i+1]; /* Tabelleneintrag */
seq_table[Pos].len = Len - 2;
seq_table[Pos].pos = i + 2;
i += Len;
}
i++; /* Tabellenende überspringen */
/* jetzt die ÜbersetzungsTabelle: */
while (cfg_ptr[i] != '\0') /* Tabelle wird mit einem NUL-Byte beendet */
{
Len = cfg_ptr[i];
Pos = cfg_ptr[i+1];
trans_table[Pos].len = Len - 2;
trans_table[Pos].pos = i + 2;
i += Len;
}
/* Optimierung der Druckercharakteristik-Tabelle: */
/* 1. die Texteffekte: */
for (i = BOLD; i <= _UNDERLINE; i+=4)
for (j = i; j <= i+1; j++)
{
if ((seq_table[j].len == 0) && (seq_table[j+2].len != 0))
seq_table[j] = seq_table[j+2];
if ((seq_table[j+2].len == 0) && (seq_table[j].len != 0))
seq_table[j+2] = seq_table[j];
}
/* 2. die Schriftarten: */
for (i = _1STTYPE; i <= _1STTYPE + 6; i+=2)
{
if ((seq_table[i].len == 0) && (seq_table[i+1].len != 0))
seq_table[i] = seq_table[i+1];
if ((seq_table[i+1].len == 0) && (seq_table[i].len != 0))
seq_table[i+1] = seq_table[i];
}
config_read = TRUE;
return TRUE;
}
void wp_get_prnname(char *Printername, int max_len)
{
int i;
if (cfg_ptr != NULL)
{
i = 8;
while ((cfg_ptr[i] != '\0') && (i < (max_len + 8)))
{
Printername[i-8] = cfg_ptr[i];
i++;
}
Printername[i - 8] = '\0';
}
else
Printername[0] = '\0';
}
bool wp_send_init(bool use_nlq)
{
bool ok;
if (use_nlq)
nlq_set = 2;
else
nlq_set = 0;
ok = print_seq(PRINTERINIT); /* allgemeiner Init */
if (ok)
{
print_seq(HORZINIT); /* Horizontale Initialisierung */
print_seq(VERTINIT); /* Vertikale Initialisierung */
print(BOLD, FALSE); /* Fettschrift aus. */
print(ITALIC, FALSE); /* Kursivschrift aus. */
print(LIGHT, FALSE); /* Light aus. */
print(SUPERSCRIPT, FALSE); /* Superscript aus. */
print(SUBSCRIPT, FALSE); /* Subscript aus. */
print(_UNDERLINE, FALSE); /* Unterstreichung aus. */
akt_mode = -1;
print_seq(_1STTYPE); /* PICA (10 CPI) */
akt_color = -1;
print_seq(_1STCOLOR); /* Color-Einstellung: Black. */
proportional = FALSE;
print_seq(PROP + 1); /* proportional-Schrift aus. */
}
return ok;
}
bool wp_send_exit(void)
{
return print_seq(PRINTERINIT);
}
bool wp_set_mode(int mode)
{
bool ok = TRUE;
if ((mode >= PICA) && (mode <= EXPANDED))
{
if (mode != akt_mode)
{
ok = print_seq(2 * mode + _1STTYPE + (nlq_set / 2));
akt_mode = mode;
}
}
return ok;
}
bool wp_formfeed(void)
{
return print_seq(FORMFEED);
}
void wp_set_tabsize(int tab)
{
tab_size = tab;
}
bool wp_write_ln(void)
{
bool ok;
ok = print_seq(WRITELN);
char_pos = 0;
return ok;
}
bool wp_write(char ch)
{
int i;
bool ok;
if ((ch == TAB) || (ch == ' '))
{
if (proportional)
{
if (ch == ' ')
{
char_pos++;
nr_spaces++;
}
else
{
char_pos += tab_size;
nr_spaces += tab_size;
}
}
else
{
if (ch == ' ')
ok = write_char(' ');
else
for (i = 1; i <= tab_size; i++)
ok = write_char(' ');
}
}
else
{
if (nr_spaces > 1)
ok = set_head();
else if (nr_spaces == 1)
{
ok = write_char(' ');
nr_spaces = 0;
}
ok = write_char(ch);
}
return ok;
}
bool wp_write_string(char *Str)
{
int i;
bool ok = TRUE;
i = 0;
while ((Str[i] != '\0') && ok)
{
ok = wp_write(Str[i]);
i++;
}
return ok;
}
bool wp_open(char *name)
{
long err;
if (strcmp(name, "PRN:") == 0)
prn_hdl = -3;
else if (strcmp(name, "AUX:") == 0)
prn_hdl = -2;
else
{
err = Fopen(name, 1);
if (err == -33)
err = Fcreate(name, 0);
else if (err > 0)
{
prn_hdl = (int) err;
Fseek(0, prn_hdl, 2);
}
}
return (prn_hdl > -31);
}
void wp_close(void)
{
Fclose(prn_hdl);
}